#include "commonpage.h"
#include "ui_commonpage.h"

#include "listitembox.h"
#include "music.h"
#include <QDebug>

CommonPage::CommonPage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::CommonPage)
{
    ui->setupUi(this);

    ui->pageMusicList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//关掉 水平滚动条 --改变了 但此时需要 手动调用窗口重绘
//    ui->pageMusicList->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);   修改竖直滚动条样式

    //从这里出发 commonpage中的playAllBtn"播放全部"按钮被点击后 发送一个自定义信号给qqmusic来接收
    connect(ui->playAllBtn,&QPushButton::clicked,this,[=](){ //因为有参数所以只能手动connect连接
        //点击"播放所有"按钮后，通知QQMusic播放当前哪个pageType页面的所有歌曲
        emit playAll(pageType); //参数是当前页面的类型到底是哪个页面
    });

    //从这里出发 鼠标双击 后发射playMusicByIndex信号告诉QQMsuic 播放this页面中index被双击的歌曲
    connect(ui->pageMusicList,&QListWidget::doubleClicked,this,[=](const QModelIndex &index){
        emit playMusicByIndex(this,index.row()); //row()方法把QModelIndex转为int
    });
}

CommonPage::~CommonPage()
{
    delete ui;
}

void CommonPage::setCommonPageUi(const QString &text, const QString &imagePath)
{
    ui->PageTittle->setText(text);
    ui->musicImageLabel->setPixmap(QPixmap(imagePath));
    ui->musicImageLabel->setScaledContents(true); //setScaledContents方法是让musicImageLabel自己适应调整大小


//    //测试 将ListBoxItem对象添加到到pageMusicList(QListWidegt)中
//    ListItemBox* listItemBox = new ListItemBox(this); //我们自定义的控件 需要被添加
//    QListWidgetItem* item = new QListWidgetItem(ui->pageMusicList);//QListWidget内创建一个QListWidgetItem
//    ui->pageMusicList->setItemWidget(item,listItemBox);//item就是QListWidgetItem类型 在QListWidget内 把自定义的控件listItemBox添加进去
//    //注意
//    //item->sizeHint();  这个是获取默认的推荐大小   如果没有设置大小item->setSizeHint(),则会使用默认的推荐大小
//    item->setSizeHint(listItemBox->sizeHint()); //创建的 QListWidgetItem* item 会使用默认的推荐大小 需要设置
//    //也可以 item->setSizeHint(QSize(listItemBox->width(),listItemBox->height()));
}

void CommonPage::setMusicListType(PageType pageType)
{
    this->pageType = pageType;
}

void CommonPage::addMusicToMusicPage( MusicList &musicList) //musicList里面存储的是music对象
{
    //清除之前的歌曲内容 - 与界面显示有关 否则会重复添加歌曲
    musicOfPage.clear();

    for(auto e:musicList) //e代表music对象 从musicList中遍历  但是 自定义类型 需要在musicList中有begin,end方法 编译器会自动去找 无需调用
    {
        switch(pageType)
        {
        case LIKE_PAGE:
            if(e.getIsLike()==true) //来到喜欢页中 还要判断是否为 喜欢的页面  用户决定
            {
                musicOfPage.push_back(e.getMusicId());//音乐id添加到musicOfPage中
            }
            break;
        case LOCAL_PAGE:
            musicOfPage.push_back(e.getMusicId());  //这行不判断
            break;
        case HISTORY_PAGE:
            if(e.getIsHistory())
            {
                musicOfPage.push_back(e.getMusicId());
            }
            break;
        default:
            qDebug()<<"暂未支持";
        }
    }
}

//将歌曲信息更新到界面
void CommonPage::reFresh(MusicList &musicList)
{
    // 将QListWidget之前已经添加的内容清空 - 否则会添加重复的音乐
    ui->pageMusicList->clear(); //会把对象释放 释放的是item  其实listitembox也会被释放不会出现内存泄露

    //添加新的收藏(历史)歌曲
    addMusicToMusicPage(musicList);

    for(auto musicId : musicOfPage) //musicOfPage中是该页面的所有音乐ID 取出
    {
        auto it = musicList.findMusicByMusicId(musicId);
        if(it == musicList.end())
        {
            continue;
        }

        //将music的歌曲名称 作者 专辑名称 更新到页面

        //先将ListBoxItem对象添加到到pageMusicList(QListWidegt)中
        ListItemBox* listItemBox = new ListItemBox(this); //我们自定义的控件 需要被添加

        listItemBox->setMusicName(it->getMusicName());
        listItemBox->setMusicSinger(it->getMusicSinger());
        listItemBox->setMusicAlbum(it->getMusicAlbumn());
        listItemBox->setLikeMusic(it->getIsLike());// 这些只是创建了ListBoxItem对象中 并把数据添加到其中
        // 但还需把ListBoxItem对象 添加到页面
        QListWidgetItem* item = new QListWidgetItem(ui->pageMusicList);//QListWidget内创建一个QListWidgetItem
        ui->pageMusicList->setItemWidget(item,listItemBox);//item就是QListWidgetItem类型 在QListWidget内 把自定义的控件listItemBox添加进去
        //注意
        //item->sizeHint();  这个是获取默认的推荐大小   如果没有设置大小item->setSizeHint(),则会使用默认的推荐大小
        item->setSizeHint(listItemBox->sizeHint()); //创建的 QListWidgetItem* item 会使用默认的推荐大小 需要设置
        //也可以 item->setSizeHint(QSize(listItemBox->width(),listItemBox->height()));


        //commonPage获得需要更新islike的music 再去qqmusic,qqmusic获取不到是哪个music commonPage做转接
        connect(listItemBox,&ListItemBox::setIsLike,this,[=](bool isLike)
        {
            //更新歌曲状态
            //通过QQMusic 让其likePage localPage recentPage 更新页面的歌曲信息
            emit updateLikeMusic(isLike,it->getMusicId());
        });
    }


    //触发窗口重绘paintEvent
    //update();  // update()将paintEvent事件放在事件循环队列中，没有立马处理    多次合并优化减少不必要的重绘
    repaint(); // repaint()立马响应paintEvent事件   立即重绘
}

void CommonPage::addMusicToPlaylist(MusicList &musicList, QMediaPlaylist *playList)
{
    for(auto music : musicList)
    {
        switch(pageType)
        {
        case LIKE_PAGE:
            if(music.getIsLike())
            {
                playList->addMedia(music.getMusicUrl());
            }
            break;
        case LOCAL_PAGE:
            playList->addMedia(music.getMusicUrl());
            break;
        case HISTORY_PAGE:
            if(music.getIsHistory())
            {
                playList->addMedia(music.getMusicUrl());
            }
            break;
        default:
            qDebug()<<"未支持页面";
        }
    }
}

QString CommonPage::getMusicIdByIndex(int index)
{
    if(index >= musicOfPage.size())
    {
        qDebug()<<"无此歌曲";
        return "";
    }

    return musicOfPage[index];
}


void CommonPage::setMusicImage(QPixmap pixmap)//更新commonPage中的图片
{
    ui->musicImageLabel->setPixmap(pixmap);
    ui->musicImageLabel->setScaledContents(true);
}
